#pragma once
#include <vector>
#include <string>
#include "IRoom.hh"
#include "Player.hh"
#include "DataManager.hh"
#include "../Utils/include/json.hpp"
#include "Inventory.hh"

using json = nlohmann::json;

enum class Direction {
    NORTH,
    EAST,
    WEST,
    SOUTH
};

// 关卡类,负责管理游戏关卡的运行
class Level {
private:
    DataManager& dataManager_;                      // 数据管理器引用
    std::vector<std::vector<int>> roomGrid_;       // 房间网格,0表示无房间,-1表示出口
    int playerX_;                                   // 玩家当前X坐标
    int playerY_;                                   // 玩家当前Y坐标
    int currentFloor_;                             // 当前所在层数(1-3)

public:
    Level(DataManager& dm);
    Level(const Level& other)= delete;             // 禁用拷贝构造
    Level& operator=(const Level& other) = delete; // 禁用赋值运算符
    ~Level();

    // 关卡初始化与状态查询
    void init(const std::vector<std::vector<int>>& roomGrid);  // 使用2D房间网格初始化关卡
    int getPlayerX() const;                                    // 获取玩家X坐标
    int getPlayerY() const;                                    // 获取玩家Y坐标
    std::string directionToString(Direction dir) const;        // 将方向枚举转换为字符串
    bool isFinished() const;                                   // 检查关卡是否完成
    int getCurrentRoomID() const;                              // 获取当前房间ID
    
    // 移动相关
    std::vector<Direction> getAvailableDirections() const;     // 获取当前位置可移动的方向
    bool move(Direction direction);                            // 尝试向指定方向移动
    
    // 游戏流程
    void play(Player* player, DataManager& roomManager);       // 主要游戏循环
    bool hasNextFloor() const;                                 // 检查是否有下一层
    void setCurrentFloor(int floor);                          // 设置当前层数
    void showSmallMap() const;                                // 显示小地图
    
    // 存档相关
    nlohmann::json toJson() const;                            // 将关卡数据转换为JSON
    void fromJson(const nlohmann::json& j);                   // 从JSON加载关卡数据
    void loadFloorMap(const std::vector<std::vector<int>>& newMap);  // 加载新的楼层地图
    bool advanceToNextFloor(const std::vector<std::vector<int>> &nextFloorMap); // 前进到下一层
    int getCurrentFloor() const;                              // 获取当前层数
};
